#============================================================
#	Item Factory
#============================================================
#  物品工厂
#============================================================
# @datetime: 2022-4-17 14:02:33
#============================================================
extends Node


var __base_item__ : PackedScene = load("res://src/scene/item/Normal.tscn")
var __data__ : Dictionary = {}



#============================================================
#   Set/Get
#============================================================
func get_data() -> Dictionary:
	return __data__

func get_item(item_name: String) -> Dictionary:
	return __data__.get(item_name, {})

func has_item(item_name: String) -> bool:
	return __data__.has(item_name)

func get_all_item() -> Array:
	return __data__.values()


#============================================================
#   内置
#============================================================
func _init():
	# 这个 json 数据按照物品名称作为 key
	load_data("res://src/assets/ItemData.json")


#============================================================
#   自定义
#============================================================
##  实例化物品节点
## @item_name  
## @return  
func instance_item_node(item_name: String) -> BaseItem:
	var data = get_item(item_name)
	var node : BaseItem = __base_item__.instance() 
	node.set_data(data)
	return node


##  随机物品节点 
## @condition  
## @return  
func rand_item_node(condition: Dictionary = {}) -> BaseItem:
	return instance_item_node(rand_item(condition)['name'])


##  添加多个数据
## @data  
func add_datas(data: Dictionary):
	for key in data:
		add_data(key, data[key])

##  添加数据
## @key  
## @value  
func add_data(key, value):
	__data__[key] = value

##  加载数据
## @path  数据路径
func load_data(path: String) -> void:
	var file = File.new()
	file.open(path, File.READ)
	var text = file.get_as_text()
	file.close()
	var data = parse_json(text)
	if __data__.size() == 0:
		__data__ = data
	else:
		add_datas(data)


##  随机物品 
## @return  
func rand_item(condition: Dictionary = {}) -> Dictionary:
	if __data__.size():
		if condition.size() > 0:
			return __data__.values()[randi() % __data__.size()]
		else:
			var datas = filter(condition)
			return datas[randi() % datas.size()]
	return {}


##  过滤
## @condition  和这个数据的 key 的值相同的物品
## @return  返回过滤出来的物品
func filter(condition: Dictionary) -> Array:
	if condition.size() == 0:
		return get_data().values()
	var list : Array = []
	var keys : Array = condition.keys()
	var temp : Dictionary = {}
	for item in get_all_item():
		for key in keys:
			temp[key] = item[key]
		if temp.hash() == condition.hash():
			list.append(item)
	return list


